# OBS CMake common version helper module

include_guard(GLOBAL)

# 设置默认版本
set(_obs_default_version "1.0.0")
set(_obs_version ${_obs_default_version})
set(_obs_version_canonical ${_obs_default_version})

# 尝试从Git自动发现OBS版本
if(NOT DEFINED OBS_VERSION_OVERRIDE AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git")
  execute_process(
    COMMAND git describe --always --tags --dirty=-modified
    OUTPUT_VARIABLE _obs_version
    ERROR_VARIABLE _git_describe_err
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    RESULT_VARIABLE _obs_version_result
    OUTPUT_STRIP_TRAILING_WHITESPACE
  )

  if(_obs_version_result EQUAL 0)
    # 尝试从版本字符串中提取MAJOR.MINOR.PATCH
    string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" SEMVER "${_obs_version}")
    
    if(SEMVER)
      # 成功提取标准版本号
      string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${SEMVER})
      message(STATUS "从Git获取版本号: ${_obs_version} (规范格式: ${SEMVER})")
    else()
      # 未提取到标准版本号，使用默认版本
      message(WARNING "无法从Git标签(${_obs_version})提取标准版本号，使用默认版本: ${_obs_default_version}")
      string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${_obs_default_version})
    endif()
  else()
    # Git命令执行失败，使用默认版本
    message(WARNING "Git describe命令失败: ${_git_describe_err}，使用默认版本: ${_obs_default_version}")
    string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${_obs_default_version})
  endif()
elseif(DEFINED OBS_VERSION_OVERRIDE)
  # 用户通过-DOBS_VERSION_OVERRIDE指定版本
  if(OBS_VERSION_OVERRIDE MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+).*")
    string(
      REGEX REPLACE
      "([0-9]+)\\.([0-9]+)\\.([0-9]+).*"
      "\\1;\\2;\\3"
      _obs_version_canonical
      ${OBS_VERSION_OVERRIDE}
    )
    set(_obs_version ${OBS_VERSION_OVERRIDE})
  else()
    message(FATAL_ERROR "提供的版本无效 - 必须是<MAJOR>.<MINOR>.<PATCH>[-(rc|beta)<NUMBER>]格式。")
  endif()
else()
  # 没有Git信息且未指定版本，使用默认版本
  message(WARNING "未找到Git仓库且未定义OBS_VERSION_OVERRIDE，使用默认版本: ${_obs_default_version}")
  string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+).*" "\\1;\\2;\\3" _obs_version_canonical ${_obs_default_version})
endif()

# 设置beta/rc版本（如果版本字符串中包含后缀）
if(_obs_version MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+-rc[0-9]+")
  string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.[0-9]+-rc([0-9]+).*$" "\\1" _obs_release_candidate ${_obs_version})
elseif(_obs_version MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+-beta[0-9]+")
  string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.[0-9]+-beta([0-9]+).*$" "\\1" _obs_beta ${_obs_version})
endif()

# 确保版本号列表至少有3个元素
list(LENGTH _obs_version_canonical VERSION_LENGTH)
while(VERSION_LENGTH LESS 3)
  list(APPEND _obs_version_canonical "0")
  list(LENGTH _obs_version_canonical VERSION_LENGTH)
endwhile()

# 安全获取各部分版本号
list(GET _obs_version_canonical 0 OBS_VERSION_MAJOR)
list(GET _obs_version_canonical 1 OBS_VERSION_MINOR)
list(GET _obs_version_canonical 2 OBS_VERSION_PATCH)

set(OBS_RELEASE_CANDIDATE ${_obs_release_candidate})
set(OBS_BETA ${_obs_beta})

string(REPLACE ";" "." OBS_VERSION_CANONICAL "${_obs_version_canonical}")
string(REPLACE ";" "." OBS_VERSION "${_obs_version}")

if(OBS_RELEASE_CANDIDATE GREATER 0)
  message(
    AUTHOR_WARNING
    "******************************************************************************\n"
    "  + OBS-Studio - 检测到候选发布版本，OBS_VERSION现在是: ${OBS_VERSION}\n"
    "******************************************************************************"
  )
elseif(OBS_BETA GREATER 0)
  message(
    AUTHOR_WARNING
    "******************************************************************************\n"
    "  + OBS-Studio - 检测到Beta版本，OBS_VERSION现在是: ${OBS_VERSION}\n"
    "******************************************************************************"
  )
endif()

unset(_obs_default_version)
unset(_obs_version)
unset(_obs_version_canonical)
unset(_obs_release_candidate)
unset(_obs_beta)
unset(_obs_version_result)